Sqlserver使用BULK同时导入多个txt、csv文件

BULK语句基础

BULK有很多参数,但是常用的只有几个,下面简单介绍一下

bulk insert [DatabaseName].[dbo].[table] from 'C:\data.txt'  
 with(   
   FIRSTROW =1, --指定要加载的第一行的行号。默认值是指定数据文件中的第一行   
   CODEPAGE=''936'', --数据库中的编码类型
   FIELDTERMINATOR='','',   --分隔符
   ROWTERMINATOR='/n'  --换行符 
)  

代码行中的命名规则
下面代码均使用该命名规则!!!

[DatabaseName].[dbo].[table] 指的是某个数据库中的表的名字
C:\ 指的是文件所在路径,例:C:\Program Files\ 指的是在C盘Program Files文件夹里的文件
data.txt 指的是所需导入文件的名称

  • FIRSTROW 属性
    指定要加载的第一行的行号。默认值是指定数据文件中的第一行。FIRSTROW 从 1 开始。
    注意:FIRSTROW 属性不可用于跳过列标题。 BULK INSERT 语句不支持 跳过标题。 跳过行时, SQL Server 数据库引擎只考虑字段终止符,而不会对所跳过行的字段中的数据进行验证。
  • CODEPAGE属性
    是数据库的编码类型。若导入数据库的中文数据是乱码,往往与这个有关!!!
    常用编码类型:
编码 编码含义
936 简体中文GBK
65001 UFT-8
  • FIELDTERMINATOR属性
    标识分隔内容的符号。一般csv的分隔符是“”,txt的话可能是空格或者其他符符号比如“ | ”。
  • ROWTERMINATOR属性
    标识分隔行的符号 ,即换行符
    常见换行符:
换行符 含义 常见显示
0x0D 指的是“回车” \r
0x0A 指的是“换行” \n
0x0D + 0x0A 回车换行 \r\n
char(13) 指的是“回车” \r
char(10) 指的是“换行” \n

BULK语法中全部参数如下:

BULK INSERT    
   [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]    
      FROM 'data_file'    
     [ WITH    
        (    
   [ [ , ] BATCHSIZE = batch_size ]    --BATCHSIZE指令来设置在单个事务中可以插入到表中的记录的数量   
   [ [ , ] CHECK_CONSTRAINTS ]     --指定在大容量导入操作期间,必须检查所有对目标表或视图的约束。若没有 CHECK_CONSTRAINTS 选项,则所有 CHECK 和 FOREIGN KEY 约束都将被忽略,并且在此操作之后表的约束将标记为不可信。   
   [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]  --指定该数据文件中数据的代码页   
   [ [ , ] DATAFILETYPE =    
      { 'char' | 'native'| 'widechar' | 'widenative' } ]  --指定 BULK INSERT 使用指定的数据文件类型值执行导入操作。   
   [ [ , ] FIELDTERMINATOR = 'field_terminator' ]  --标识分隔内容的符号   
   [ [ , ] FIRSTROW = first_row ]    --指定要加载的第一行的行号。默认值是指定数据文件中的第一行   
   [ [ , ] FIRE_TRIGGERS ]     --是否启动触发器   
   [ [ , ] FORMATFILE = 'format_file_path' ]    
   [ [ , ] KEEPIDENTITY ]   --指定导入数据文件中的标识值用于标识列   
   [ [ , ] KEEPNULLS ]    --指定在大容量导入操作期间空列应保留一个空值,而不插入用于列的任何默认值   
   [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]    
   [ [ , ] LASTROW = last_row ]   --指定要加载的最后一行的行号   
   [ [ , ] MAXERRORS = max_errors ]   --指定允许在数据中出现的最多语法错误数,超过该数量后将取消大容量导入操作。   
   [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]  --指定数据文件中的数据如何排序   
   [ [ , ] ROWS_PER_BATCH = rows_per_batch ]    
   [ [ , ] ROWTERMINATOR = 'row_terminator' ]   --标识分隔行的符号   
   [ [ , ] TABLOCK ]     --指定为大容量导入操作持续时间获取一个表级锁   
   [ [ , ] ERRORFILE = 'file_name' ]   --指定用于收集格式有误且不能转换为 OLE DB 行集的行的文件。   
        )]   

ps.根本看不下去,具体使用方法点击下方的链接参考官方文档。

更多细节点击链接查看微软官方文档

现在我们来看如何导入表

  • 步骤1 创建表结构

通过BULK方式导入数据,首先需要数据库里有该表的空的表结构。
这时可以通过create table语句创建,也可以用Excel文件复制个表头,手动导入表结构。
比如说创建好表结构的空表为:[dbo].[table]

  • 步骤2 执行代码

CSV

导入单个csv

DECLARE @bulk_cmd nvarchar(1000)
SET @bulk_cmd = 'BULK INSERT [DatabaseName].[dbo].[table] ' +
'FROM '+'''C:\data.csv'''+'WITH (FIELDTERMINATOR = '','',CODEPAGE=''936'',FIRSTROW=1,ROWTERMINATOR = '''+char(10)+''')'
EXEC(@bulk_cmd)
go

循环导入多个csv

循环导入的逻辑是把CSV文件的文件名改成 data(1).csv,data(2).csv...data(18).csv的形式,放入循环中,循环执行上面的单个csv文件导入的命令。

点击该链接查看如何 批量修改文件名

declare @n int,@filename varchar(255),@sql varchar(1000)
set @n=1
while @n<=18
begin 
set @filename='data('+ltrim(rtrim(str(@n)))+').csv'
print @filename
set @sql='bulk insert [DatabaseName].[dbo].[table]  from ''C:\'+@filename+''' 
        with (FIRSTROW =1,CODEPAGE=''936'',FIELDTERMINATOR = '','',ROWTERMINATOR = '''+CHAR(10)+''')'
print @sql
exec(@sql)
set @n=@n+1
end

TXT

导入单个txt

truncate table [dbo].[PINGZHENG201702]
DECLARE @bulk_cmd nvarchar(1000)
SET @bulk_cmd = 'BULK INSERT [DatabaseName].[dbo].[table] ' +
'FROM '+'''C:\文件名.txt'''+'WITH (FIELDTERMINATOR = '','',CODEPAGE=''936'',FIRSTROW=1,ROWTERMINATOR = '''+char(10)+''')'
EXEC(@bulk_cmd)
go

循环导入多个txt

循环导入的逻辑是把TXT文件的文件名改成 data(1).txt,data(2).txt...data(18).txt的形式,放入循环中,循环执行上面的单个txt文件导入的命令。

declare @n int,@filename varchar(255),@sql varchar(1000)
set @n=10
while @n<=12
begin 
set @filename='data('+ltrim(rtrim(str(@n)))+').txt'
print @filename
set @sql='bulk insert [DatabaseName].[dbo].[table]  from ''C:\'+@filename+''' 
        with (FIRSTROW =1,CODEPAGE=''936'',FIELDTERMINATOR = ''|'',ROWTERMINATOR=''0x0A'')'
print @sql
exec(@sql)
set @n=@n+1
end

升级版已经发布,可以在不改文件名的前提下,直接导入文件夹内所有文件 详情请点击Sqlserver使用BULK同时导入文件夹内所有txt、csv文件


勇者无惧,强者无敌
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容